package com.app.sgd.controller.action;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.app.sgd.business.dao.OracleExpedienteDAO;
import com.app.sgd.business.dao.SQLSeguimientoDAO;
import com.app.sgd.business.dao.SQLVariablesSesionDAO;
import com.app.sgd.manager.SGDDispatchAction;
import com.app.sgd.model.bean.Acciones;
import com.app.sgd.model.bean.DeletedSupList;
import com.app.sgd.model.bean.DestinoDocumento;
import com.app.sgd.model.bean.Documento;
import com.app.sgd.model.bean.Usuario;
import com.app.sgd.util.Constants;
import com.app.sgd.util.SessionConstants;
import com.app.sgd.util.Util;
import com.app.sgd.view.actionform.SeguimientoForm;
import com.app.sgd.view.vo.FiltroBusquedaVO;

public class SeguimientoAction extends SGDDispatchAction{
	private static Logger logger = Logger.getLogger(SeguimientoAction.class);
	
	public void reset(ActionForm form, HttpServletRequest request){
		SeguimientoForm formdoc = (SeguimientoForm)form;
		formdoc.setCheckValuesFechaAtencion(new String());
		formdoc.setCheckValuesObservaciones(new String());
		formdoc.setCheckValuesSeguimiento(new String[0]);
		formdoc.setLstSeguimientos(new ArrayList());
		formdoc.setLstExpedienteBCA(new ArrayList());
	}
	
	public ActionForward verSeguimiento(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		try{
			reset(form, request);
			SeguimientoForm formdoc = (SeguimientoForm)form;
			String index = request.getParameter("index");
			String vista = request.getParameter("vista");
			String codDocumento = request.getParameter("codDocumento");
			
			Usuario usuarioLogin = (Usuario)request.getSession().getAttribute(SessionConstants.SGD_USUARIO_SESION_ACTIVO);
			
			ArrayList lstDocumentos = (ArrayList)request.getSession().getAttribute(SessionConstants.LISTA_DOCUMENTOS_MOSTRAR);
			Documento documentoEditar = (Documento) lstDocumentos.get(Integer.parseInt(index));

			SQLVariablesSesionDAO sqlVariablesSesionDAO = new SQLVariablesSesionDAO();
			ArrayList lstEstadosAccion = sqlVariablesSesionDAO.getEstadoAccion();
			request.getSession().setAttribute(SessionConstants.LISTA_ESTADO_ACCION, lstEstadosAccion);
			
			formdoc.setIndexDocumento(index);
			formdoc.setCodDocumento(codDocumento);
			formdoc.setNumDocumento(documentoEditar.getNumDocumento().equals(Constants.DOCUMENTO_SIN_NUMERO) ? Constants.VALOR_DEFAULT_VACIO : documentoEditar.getNumDocumento());
			formdoc.setTipoDocumento(documentoEditar.getDescTipoDocumento());
			formdoc.setTipoMovimiento(documentoEditar.getDescMovimiento());
			formdoc.setNumRegistro(documentoEditar.getNroRegDocumento());
			formdoc.setVista(vista);
			
			FiltroBusquedaVO filtroBusquedaVO = new FiltroBusquedaVO();
			filtroBusquedaVO.setCodDocumento(codDocumento);
			filtroBusquedaVO.setCodSeguimiento(Constants.VALOR_DEFAULT_CERO);
			filtroBusquedaVO.setUsuario(usuarioLogin);
			
			SQLSeguimientoDAO sqlSeguimientoDAO = new SQLSeguimientoDAO();
			ArrayList lstSeguimiento = sqlSeguimientoDAO.listarSeguimientoDocumento(filtroBusquedaVO);
			request.getSession().setAttribute(SessionConstants.LISTA_SEGUIMIENTOS_MOSTRAR, lstSeguimiento);
			formdoc.setLstSeguimientos(lstSeguimiento);
			
			OracleExpedienteDAO oracleExpedienteDAO = new OracleExpedienteDAO();
        	ArrayList lstExpedientesBCA = oracleExpedienteDAO.obtenerExpedientesBCA(Integer.parseInt(documentoEditar.getCodExpedienteBCA()));
			if(lstExpedientesBCA.size()>0)
				formdoc.setLstExpedienteBCA(lstExpedientesBCA);
			
			return mapping.findForward("seguimiento");
		}catch(Exception e){
			logger.error("[STD]: Error en verSeguimiento "+e.getMessage());
			e.printStackTrace();
			return mapping.findForward("error");
		}
	}
	
	public ActionForward eliminarSeguimientos(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		try{
			SeguimientoForm formdoc = (SeguimientoForm)form;
			formdoc.setCheckValuesSeguimiento(new String[0]);
			return mapping.findForward("seguimiento");
		}catch(Exception e){
			logger.error("[STD]: Error en eliminarSeguimientos "+e.getMessage());
			e.printStackTrace();
			return mapping.findForward("error");
		}
	}
	
	public ActionForward atenderSeguimientos(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		try{
			SeguimientoForm formdoc = (SeguimientoForm)form;
			Usuario usuarioLogin = (Usuario)request.getSession().getAttribute(SessionConstants.SGD_USUARIO_SESION_ACTIVO);
			
			String sel[] = formdoc.getCheckValuesSeguimiento();
			String checkValuesFechaAtencion[] = formdoc.getCheckValuesFechaAtencion().split("#");
			String checkValuesObservaciones[] = formdoc.getCheckValuesObservaciones().split("#");
			
			ArrayList lstSeguimiento = (ArrayList)request.getSession().getAttribute(SessionConstants.LISTA_SEGUIMIENTOS_MOSTRAR);
			
			ArrayList lstSeguimientoAtender = new ArrayList();
			for(int i=0,n=sel.length; i<n;i++){
				lstSeguimientoAtender.add(lstSeguimiento.get(Integer.parseInt(sel[i])));
			}
			
			for(int i=0,n=lstSeguimientoAtender.size(); i<n;i++){
				((DestinoDocumento)lstSeguimientoAtender.get(i)).setFechaAtencion(checkValuesFechaAtencion[i]);
				((DestinoDocumento)lstSeguimientoAtender.get(i)).setObservacion(checkValuesObservaciones[i]);
			}
			
			int size = lstSeguimientoAtender.size();
			
			SQLSeguimientoDAO sqlSeguimientoDAO = new SQLSeguimientoDAO();
			int res = sqlSeguimientoDAO.atenderSeguimientos(lstSeguimientoAtender,usuarioLogin);
			
			formdoc.setCheckValuesSeguimiento(new String[0]);
			
			FiltroBusquedaVO filtroBusquedaVO = new FiltroBusquedaVO();
			filtroBusquedaVO.setCodDocumento(formdoc.getCodDocumento());
			filtroBusquedaVO.setCodSeguimiento(Constants.VALOR_DEFAULT_CERO);
			filtroBusquedaVO.setUsuario(usuarioLogin);
			
			ArrayList lstSeguimientoNew = sqlSeguimientoDAO.listarSeguimientoDocumento(filtroBusquedaVO);
			request.getSession().setAttribute(SessionConstants.LISTA_SEGUIMIENTOS_MOSTRAR, lstSeguimientoNew);
			
			return mapping.findForward("seguimiento");
		}catch(Exception e){
			logger.error("[STD]: Error en atenderSeguimientos "+e.getMessage());
			e.printStackTrace();
			return mapping.findForward("error");
		}
	}
	
	public ActionForward grabarSeguimientos(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		try{
			SeguimientoForm formdoc = (SeguimientoForm)form;
			Usuario usuarioLogin = (Usuario)request.getSession().getAttribute(SessionConstants.SGD_USUARIO_SESION_ACTIVO);
			
			String sel[] = formdoc.getCheckValuesSeguimiento();
			String checkValuesIndiceSeg = formdoc.getCheckValuesIndiceSeg();
			String checkValuesFechaAtencion[] = formdoc.getCheckValuesFechaAtencion().split("#");
			String checkValuesObservaciones[] = formdoc.getCheckValuesObservaciones().split("#");
			String checkValuesCodigoAccion[] = formdoc.getCheckValuesCodigoAccion().split("#");
			String checkEstadosAccion[] = formdoc.getCheckEstadosAccion().split("#");
			
			ArrayList lstSeguimiento = (ArrayList)request.getSession().getAttribute(SessionConstants.LISTA_SEGUIMIENTOS_MOSTRAR);
			
			ArrayList lstSeguimientoSelecccionados = new ArrayList();
			ArrayList lstSeguimientoGrabar = new ArrayList();
			
			for(int i=0,n=lstSeguimiento.size(); i<n;i++){
				if(checkValuesIndiceSeg.indexOf("|"+i+"|")>-1)
					lstSeguimientoSelecccionados.add(lstSeguimiento.get(i));
			}
			
			int ind=0;
			for(int i=0,n=lstSeguimientoSelecccionados.size(); i<n;i++){
				DestinoDocumento destinoDocumento = (DestinoDocumento)lstSeguimientoSelecccionados.get(i);
				destinoDocumento.setFechaAtencion(checkValuesFechaAtencion[i]);
				DeletedSupList lstAcciones = destinoDocumento.getLstAcciones();
				DeletedSupList lstAccionesNew = new DeletedSupList();
				for(int j=0;j<lstAcciones.size();j++){
					Acciones acciones = (Acciones)lstAcciones.get(j);
					if(acciones.getDescEstadoAccion().equals(Constants.VALOR_DEFAULT_PENDIENTE)){// && !checkEstadosAccion[ind].equals(Constants.ESTADO_ACCIONES_PENDIENTE)){
						acciones.setCodigo(checkValuesCodigoAccion[ind]);
						acciones.setEstadoAccion(checkEstadosAccion[ind]);
						acciones.setObservacionAccion(checkValuesObservaciones[ind].trim());
						ind++;
						lstAccionesNew.add(acciones);
					}
				}
				if(lstAccionesNew.size()>0){
					destinoDocumento.setLstAcciones(lstAccionesNew);
					lstSeguimientoGrabar.add(destinoDocumento);
				}
			}
			
			int size = lstSeguimientoSelecccionados.size();
			
			SQLSeguimientoDAO sqlSeguimientoDAO = new SQLSeguimientoDAO();
			int res = sqlSeguimientoDAO.atenderSeguimientos(lstSeguimientoGrabar,usuarioLogin);
			
			formdoc.setCheckValuesSeguimiento(new String[0]);
			
			FiltroBusquedaVO filtroBusquedaVO = new FiltroBusquedaVO();
			filtroBusquedaVO.setCodDocumento(formdoc.getCodDocumento());
			filtroBusquedaVO.setCodSeguimiento(Constants.VALOR_DEFAULT_CERO);
			filtroBusquedaVO.setUsuario(usuarioLogin);
			
			ArrayList lstSeguimientoNew = sqlSeguimientoDAO.listarSeguimientoDocumento(filtroBusquedaVO);
			formdoc.setLstSeguimientos(lstSeguimientoNew);
			request.getSession().setAttribute(SessionConstants.LISTA_SEGUIMIENTOS_MOSTRAR, lstSeguimientoNew);
			
			return mapping.findForward("seguimiento");
		}catch(Exception e){
			logger.error("[STD]: Error en atenderSeguimientos "+e.getMessage());
			e.printStackTrace();
			return mapping.findForward("error");
		}
	}
	
	public ActionForward detalleSeguimiento(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		SeguimientoForm formdoc = (SeguimientoForm)form;
		String index = request.getParameter("index");

		SQLVariablesSesionDAO sqlVariablesSesionDAO = new SQLVariablesSesionDAO();
		ArrayList lstAcciones = sqlVariablesSesionDAO.getAcciones();
		ArrayList lstEstadosAccion = sqlVariablesSesionDAO.getEstadoAccion();
		
		request.getSession().setAttribute(SessionConstants.LISTA_ACCIONES, lstAcciones);
		request.getSession().setAttribute(SessionConstants.LISTA_ESTADO_ACCION, lstEstadosAccion);
		
		ArrayList lstSeguimiento = formdoc.getLstSeguimientos();//(ArrayList)request.getSession().getAttribute(SessionConstants.LISTA_SEGUIMIENTOS_MOSTRAR);
		DestinoDocumento destinoDocumento = (DestinoDocumento)lstSeguimiento.get(Integer.parseInt(index));
		
		formdoc.setCodDocumento(destinoDocumento.getCodDocumento());
		formdoc.setCodSeguimiento(destinoDocumento.getCodSeguimiento());
		formdoc.setFechaAviso(destinoDocumento.getFechaAviso());
		formdoc.setRequerimiento(destinoDocumento.getRequerimiento());
		formdoc.setObservaciones(destinoDocumento.getObservacion());
		formdoc.setFlgArchivado(destinoDocumento.getFlgArchivo());
		formdoc.setFechaAtencion(destinoDocumento.getFechaAtencion());
		formdoc.setNumSeguimientoCorr(destinoDocumento.getNumSeguimientoCorr());
		formdoc.setFlgModificarSeguimiento(destinoDocumento.getPermisos().isAtenderSeguimiento());
		formdoc.setLstAcciones(destinoDocumento.getLstAcciones());
		
		long fechFin = (new java.util.Date()).getTime();
		if(destinoDocumento.getPermisos().isAtenderSeguimiento() && destinoDocumento.getFechaAtencion().equals(Constants.VALOR_DEFAULT_VACIO)){
			formdoc.setFechaAtencion(Util.getDateAsStr(new java.util.Date(fechFin)));
		}
		
//		FiltroBusquedaVO filtroBusquedaVO = new FiltroBusquedaVO();
//		filtroBusquedaVO.setCodSeguimiento(destinoDocumento.getCodSeguimiento());
//		
//		SQLSeguimientoDAO sqlSeguimientoDAO = new SQLSeguimientoDAO();
//		DeletedSupList lstAccionesSeg = sqlSeguimientoDAO.obtenerAccionesSeguimiento(filtroBusquedaVO);
//		formdoc.setLstAcciones(lstAccionesSeg);
		
		return mapping.findForward("seguimientoDetalle");
	}
	
	public ActionForward regresarSeguimientos(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		SeguimientoForm formdoc = (SeguimientoForm)form;
		formdoc.setCheckValuesSeguimiento(new String[0]);
		return mapping.findForward("seguimiento");
	}
	
	public ActionForward actualizarSeguimiento(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		SeguimientoForm formdoc = (SeguimientoForm)form;
		
		String checkValuesEstadoAcciones[] = formdoc.getCheckValuesEstadoAcciones().split("#");
		String checkValuesObsAcciones[] = formdoc.getCheckValuesObsAcciones().split("#");
		
		DeletedSupList lstAcciones = formdoc.getLstAcciones();
		DeletedSupList lstAccionesNew = new DeletedSupList();
		for(int i=0;i<lstAcciones.size();i++){
			Acciones acciones = (Acciones)lstAcciones.get(i);
			acciones.setEstadoAccion(checkValuesEstadoAcciones[i]);
			acciones.setObservacionAccion(checkValuesObsAcciones[i].trim());
			
			lstAccionesNew.add(acciones);
		}
		
		DestinoDocumento destinoDocumento = new DestinoDocumento();
		destinoDocumento.setCodDocumento(formdoc.getCodDocumento());
		destinoDocumento.setCodSeguimiento(formdoc.getCodSeguimiento());
		destinoDocumento.setFechaAtencion(formdoc.getFechaAtencion());
		destinoDocumento.setObservacion(formdoc.getObservaciones());
		destinoDocumento.setFechaAviso(formdoc.getFechaAviso());
		destinoDocumento.setRequerimiento(formdoc.getRequerimiento());
		destinoDocumento.setFlgArchivo(formdoc.getFlgArchivado());
		destinoDocumento.setLstAcciones(lstAccionesNew);
		
		SQLSeguimientoDAO sqlSeguimientoDAO = new SQLSeguimientoDAO();
		sqlSeguimientoDAO.actualizarSeguimiento(destinoDocumento);
		
		Usuario usuarioLogin = (Usuario)request.getSession().getAttribute(SessionConstants.SGD_USUARIO_SESION_ACTIVO);
		
		FiltroBusquedaVO filtroBusquedaVO = new FiltroBusquedaVO();
		filtroBusquedaVO.setCodDocumento(formdoc.getCodDocumento());
		filtroBusquedaVO.setCodSeguimiento(Constants.VALOR_DEFAULT_CERO);
		filtroBusquedaVO.setUsuario(usuarioLogin);
		
		ArrayList lstSeguimiento = sqlSeguimientoDAO.listarSeguimientoDocumento(filtroBusquedaVO);
		formdoc.setLstSeguimientos(lstSeguimiento);
		request.getSession().setAttribute(SessionConstants.LISTA_SEGUIMIENTOS_MOSTRAR, lstSeguimiento);
		
		return mapping.findForward("seguimientoDetalle");
	}
}
